
#include "WProgram.h"
#include "Metro.h"


Metro::Metro(long intervalMillis) : Observable() {
        init(intervalMillis, smillis(), 0);
}

Metro::Metro(long intervalMillis, uint8_t autoreset) : Observable() {   
	init(intervalMillis, smillis(), autoreset);
}

Metro::Metro(long intervalMillis, long startMillis) : Observable() {   
	init(intervalMillis, smillis(), autoreset);
}

Metro::Metro(long intervalMillis, long startMillis, uint8_t autoreset) : Observable() {   
	init(intervalMillis, smillis(), autoreset);
}

void Metro::init(long intervalMillis, long startMillis, uint8_t autoreset) {
  this->intervalMillis = intervalMillis;
  this->startMillis = startMillis;
  this->timeoutMillis = startMillis + intervalMillis;
  this->autoreset = autoreset;
}

void Metro::interval(long intervalMillis)
{
  this->forced = 0;
  init(intervalMillis, smillis(), this->autoreset);
}

long Metro::getTimeoutMillis() const {
  return this->timeoutMillis;
}

long Metro::getStartMillis() const {
  return this->startMillis;
}

char Metro::check()
{
  if (this->forced) {
    if (this->autoreset) {
      interval(this->intervalMillis);
    }
    notifyObservers();
    return 1;
  }
  if (smillis() - this->timeoutMillis >= 0) {
    if (this->autoreset) {
      this->timeoutMillis += this->intervalMillis;
      this->startMillis += this->intervalMillis;
    }
    notifyObservers();
    return 1;
  }
  return 0;
}

void Metro::reset() 
{
  forced = 0;
  this->timeoutMillis = smillis() + this->intervalMillis;

}

void Metro::force() {
  forced = 1;
}


